/**
 * 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
 */

/**
 * 思路：
 * 1、新建一个Map
 * 2、遍历循环nums
 * 3、使用target减去nums[i]，当做map的key，将下标作为value
 * 4、判断map中是否有这个key，如果有则返回map的value和当前的i，如果没有则将nums[i]作为key，i作为value
 * 思考：为何要将值作为key，而不将下标作为key？
 * 主要是因为map.has()这个方法导致的，这个方法查询的是key是否有，并非是值
*/

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  let map = new Map();
  for (let i = 0; i < nums.length; i++) {
    let complete = target - nums[i];
    if (map.has(complete)) {
      return [map.get(complete), i];
    } else {
      map.set(nums[i], i);
    }
  }
  return [];
};

let arr = [2, 4, 9, 7],
  target = 9;
console.log(twoSum(arr, target));

/**
 * has([key])  检查key是否存在，存在返回true，不存在返回false
 * get([key])  去获取map的value，没有返回undefined
 * set([key, value]) 向map中添加key，value
*/